#include "linux/kernel.h"
#include "linux/types.h"


// 辅助函数：判断字符是否为空白符
int isspace(int c)
{
    return (c == ' ' || c == '\t' || c == '\n' || c == '\r' || c == '\v' || c == '\f');
}

// 辅助函数：判断字符是否为有效数字字符
int isdigit(int c)
{
    return (c >= '0' && c <= '9');
}

// 辅助函数：将字符转换为数值
int digit_value(char c)
{
    if (c >= '0' && c <= '9')
        return c - '0';
    if (c >= 'a' && c <= 'f')
        return 10 + c - 'a';
    if (c >= 'A' && c <= 'F')
        return 10 + c - 'A';
    return -1;
}

int kstrtoint(char *s, unsigned int base, int *res)
{
    if (!s || !res)
        return -1; // 空指针检查

    // 跳过前导空格
    while (isspace(*s))
        s++;

    // 处理符号
    int sign = 1;
    if (*s == '-')
    {
        sign = -1;
        s++;
    }
    else if (*s == '+')
    {
        s++;
    }

    // 处理基数自动检测
    if (base == 0)
    {
        if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X'))
        {
            base = 16;
            s += 2;
        }
        else if (s[0] == '0')
        {
            base = 8;
            s++;
        }
        else
        {
            base = 10;
        }
    }
    else if (base == 16)
    {
        // 允许前缀 0x 或 0X
        if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X'))
        {
            s += 2;
        }
    }

    // 检查基数有效性
    if (base < 2 || base > 36)
    {
        return -1;
    }

    long long value = 0;
    int count = 0; // 有效数字计数

    while (*s)
    {
        int digit = digit_value(*s);
        if (digit < 0 || digit >= base)
            break; // 非法字符或超出基数范围

        // 检查溢出
        if (value > (INT_MAX / base) ||
            (value == (INT_MAX / base) && digit > (INT_MAX % base)))
        {
            return -1; // 正向溢出
        }

        value = value * base + digit;
        count++;
        s++;
    }

    // 检查是否转换了有效数字
    if (count == 0)
        return -1;

    // 处理符号并检查负溢出
    if (sign == -1)
    {
        value = -value;
        if (value < INT_MIN)
            return -1;
    }

    // 跳过尾部空格
    while (isspace(*s))
        s++;
    if (*s != '\0')
        return -1; // 存在非法尾部字符

    *res = (int)value;
    return 0;
}
